package com.charon.common.util;

import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.NoSuchElementException;
import java.util.Properties;
import java.util.Set;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.io.DefaultResourceLoader;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;

/**
  *@ClassName: PropertiesLoader
  *@Description: Properties加载
  *@Author: Moment
  *@Date: 2018/7/7 0007 20:07
  *@Version: 1.0
  */
public class PropertiesLoader {

    private static Logger logger = LoggerFactory.getLogger(PropertiesLoader.class);
    private static Properties properties;

    /**
     * Properties文件载入工具类. 可载入多个properties文件,
     * 相同的属性在最后载入的文件中的值将会覆盖之前的值，但以System的Property优先.
     */
    private static ResourceLoader resourceLoader = new DefaultResourceLoader();


    public PropertiesLoader(String... resourcesPaths) {
        properties = loadProperties(resourcesPaths);
        //initAllConfig();
    }

    /**
     * 取出String类型的Property，但以System的Property优先,如果都为Null则抛出异常.
     */
    public String getProperty(String key) {
        String value = getValue(key);
        if (value == null) {
            throw new NoSuchElementException();
        }
        return value;
    }
    /**
     * 取出Property，但以System的Property优先,取不到返回空字符串.
     */
    private String getValue(String key) {
        String systemProperty = System.getProperty(key);
        if (systemProperty != null) {
            return systemProperty;
        }
        if (properties.containsKey(key)) {
            return properties.getProperty(key);
        }
        return "";
    }

    public void initAllConfig(Map<String,String> map){
    	Set<Entry<Object,Object>> entrySet = properties.entrySet();
    	Iterator<Entry<Object, Object>> iterator = entrySet.iterator();
    	while(iterator.hasNext()){
    		Entry<Object, Object> next = iterator.next();
    		String key=String.valueOf(next.getKey());
    		String val=String.valueOf(next.getValue());
    		if(map.containsKey(key))continue;
    		map.put(key, val);
    	}
    }

    /**
     * 载入多个文件, 文件路径使用Spring Resource格式.
     */
    private Properties loadProperties(String... resourcesPaths) {
        Properties props = new Properties();

        for (String location : resourcesPaths) {

			logger.info("Loading properties file from:" + location);

            InputStream is = null;
            try {
                Resource resource = resourceLoader.getResource(location);
                is = resource.getInputStream();
                props.load(is);
            } catch (IOException ex) {
                logger.info("Could not load properties from path:" + location + ", " + ex.getMessage());
            } finally {
                if(is!=null){
                	try {
						is.close();
					} catch (IOException e) {
						e.printStackTrace();
					}
                }
            }
        }
        return props;
    }
}
